package pe.com.hermes.hermetic.web.controller.transacciones;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.apache.log4j.Logger;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ClienteBean;
import pe.com.hermes.hermetic.beans.ClienteCorpBean;
import pe.com.hermes.hermetic.beans.CuentaBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.beans.User;
import pe.com.hermes.hermetic.exception.NiveAutoNotFoundException;
import pe.com.hermes.hermetic.negocio.managerimpl.pedido.tv.PedidoTvContainerManagerImpl;
import pe.com.hermes.hermetic.negocio.managerimpl.pedido.tv.PedidoTvManagerImpl;
import pe.com.hermes.hermetic.negocio.service.ClienteService;
import pe.com.hermes.hermetic.negocio.service.ConfiguracionService;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.PedidoService;
import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.HMF2003Form;
import pe.com.hermes.hermetic.web.forms.HMF2014Form;
import pe.com.hermes.hermetic.web.forms.HMF2015Form;
import pe.com.hermes.unidadesnegocio.general.entities.TipoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoDenoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.entities.PedidoEntity;
import pe.com.hermes.unidadesnegocio.procesamiento.managerimpl.PedidoAbstract;

@RequestMapping("/mostrarHWF2015.html")
@Controller
@SessionAttributes(value={"form"})
public class BandejaPedidosTVController implements IController{
  private Logger logger = Logger.getLogger(this.getClass());
  protected final static String TODOS = "0";
  protected final static String ALGUNOS = "1";
  
  @Autowired
  private TablService tablService;
  @Autowired
  private ClienteService clienteService;
  @Autowired
  private HermeticFacade servicioHermetic;
  @Autowired
  private ConfiguracionService configuracionService;
  @Autowired
  private PedidoService pedidoService;
  
  @RequestMapping(method={RequestMethod.GET})
  protected String showForm(ModelMap model, HttpServletRequest request, HttpSession session) throws Exception {
    List<ClienteCorpBean> listClientes = new ArrayList<ClienteCorpBean>();
    HMF2015Form form = new HMF2015Form();
    request.getSession(false).setAttribute("chksTipPedi",null);        
    request.getSession(false).setAttribute("chksClieCorp",null);        
    request.getSession(false).setAttribute("chksBanco",null);        
    form.setComboBanco("0");
    form.setFecSoliPediInic(Util.getFechaActual());
    form.setFecSoliPediFinl(Util.getFechaActual());
    User user = Util.getUser();
    form.setUsuWeb(user.getUsuWeb());
    int intTipCliente =(Integer)session.getAttribute("tipClie");
    String codSucuHtb =(String)session.getAttribute("sucursal");
    form.setCodSucuHtb(codSucuHtb);
    int intCodRazoSoci = (Integer)session.getAttribute("codRazoSoci");
    String cliente =(String)session.getAttribute("listClie");
    form.setListCodClie((String)session.getAttribute("listClie"));
    /*validaciones*/
    
    //CASO CORPORACION
    if (intTipCliente==ConstantesHermetic.TIPO_CLIE_CORP){
      String codCorp = (Integer)request.getSession(false).getAttribute("codCorp") + "";
      String usuWeb = (String)request.getSession(false).getAttribute("usuario");
      if (codSucuHtb.equals("1")) codSucuHtb = "0";
    }else{
      form.setDesClie((String)session.getAttribute("desRazoSoci"));
      form.setCodRazoSoci(intCodRazoSoci+"");
      form.setListCodClie((String)session.getAttribute("cliente"));
    }
    
    List listProcesos = new ArrayList();
    if (intTipCliente==ConstantesHermetic.TIPO_CLIE_AGEN)
        listProcesos= tablService.getTiposDinamico(ConstantesHermetic.TIPO_PROC, ConstantesHermetic.IND_TIPO_CCOM, ConstantesHermetic.CAMP_TIPO_AGEN);
    else
        listProcesos= tablService.getTiposDinamico(ConstantesHermetic.TIPO_PROC, ConstantesHermetic.IND_TIPO_CCOM, ConstantesHermetic.CAMP_TIPO_CCOM);
    List<TiposBean> listTipoFechaAux = tablService.getTiposDinamico(Integer.parseInt(ConstantesHermetic.COD_TIPO_FECH), ConstantesHermetic.IND_TIPO_FEC1, ConstantesHermetic.CAMP_TIPO_FEC1);
    List<TiposBean> listTipoFecha=new ArrayList<TiposBean>();
    for (int l=listTipoFechaAux.size()-1;l>=0;l--){
        listTipoFecha.add(listTipoFechaAux.get(l));
    }
    listTipoFechaAux=null;
    List <TiposBean>listEstadoAux = tablService.getListEstadosGeneral(ConstantesHermetic.COD_ESTD_ESTD_PEDI+"");
    List <TiposBean>listEstado = new ArrayList<TiposBean>();
    for (TiposBean estado: listEstadoAux){
        if ((estado.getCodigo().equals(ConstantesHermetic.STD_PEND+"")) || (estado.getCodigo().equals(ConstantesHermetic.STD_AUTZ+""))){
          if (estado.getCodigo().equals(ConstantesHermetic.STD_AUTZ+"")){
            estado.setDescripcion(ConstantesHermetic.ESTD_AUTO_BAND_PEDI_TV);
          }
          listEstado.add(estado);  
        }          
    }
    String codOpci = IWebOpciones.BAND_PEDI_TV;
    String desOpci = servicioHermetic.getDesOpci(codOpci, request);
    form.setListProcesos(listProcesos);
    form.setListEstado(listEstado);
    form.setListTipoFecha(listTipoFecha);
    AuditBean auditBean = new AuditBean(REGI_PEDI);
    servicioHermetic.inseAudit(auditBean);
    form.setCodOpci(codOpci);
    form.setDesOpci(desOpci);
    request.getSession(false).removeAttribute("listadoPedidosGuardados");
    model.put("mostrarElementos",1);
    model.put("codOpci",form.getCodOpci());
    model.put("desOpci",form.getDesOpci());
    model.put("listProcesos",form.getListProcesos());
    model.put("listTipoFecha",form.getListTipoFecha());
    model.put("listEstado",form.getListEstado());
    model.put(FORM_KEY,form);
    return FORM_BAND_PETV_VIEW;
  }
  
  @RequestMapping(params={"accion=mostrar"})
  protected String mostrar(HttpSession session,ModelMap model,@ModelAttribute(FORM_KEY) HMF2015Form form, HttpServletRequest request){
   
    /*checks de "algunos"*/
    String[] codClientes = (String[])request.getSession(false).getAttribute("chksClieCorp");
    String listClientes = "";
    int intTipCliente =(Integer)session.getAttribute("tipClie");
    form.setTipClie(intTipCliente+"");
    if (form.getComboCliente() == null) form.setComboCliente("0");
    if (form.getComboBanco() == null) form.setComboBanco("0");
    if(form.getComboCliente().equals(ALGUNOS)){
        if(Util.contDatosSession(codClientes)<1){
            model.put("message_alert","Seleccione al menos un cliente");
            return FORM_BAND_PETV_VIEW;
        }else{
            for (String codClies : codClientes){
              if (codClies == null) break;
              listClientes += "," + codClies;
            }
        }
      form.setListCodClie(listClientes.substring(1));
    }else{
      form.setListCodClie((String)session.getAttribute("listClie"));
    }
    String[] codBancos = (String[])request.getSession(false).getAttribute("chksBanco");
    String listBancos = "";
    if(form.getComboBanco().equals(ALGUNOS)){
        if(Util.contDatosSession(codBancos)<1){
            model.put("message_alert","Seleccione al menos un banco");
            return FORM_BAND_PETV_VIEW;
        }else{
            for (String codBanc : codBancos){
              if (codBanc == null) break;
              listBancos += "," + codBanc;
            }
        }
      form.setListCodBanc(listBancos.substring(1));
    }else{
      List listBanc = clienteService.getListBancByClie(form.getListCodClie(), "");
      for (ClienteBean banco : (List<ClienteBean>)listBanc){
          listBancos += "," + banco.getCodCliente();
      }
      form.setListCodBanc(listBancos.substring(1));
    }
    String[] codListRegiPedi = (String[])request.getSession(false).getAttribute("chksTipPedi");
    String listRegiPedi = "";
    if(form.getTipRegiPedi().equals(ALGUNOS)){
      if(Util.contDatosSession(codListRegiPedi)<1){
          model.put("message_alert","Seleccione al menos un tipo de registro");
          return FORM_BAND_PETV_VIEW;
      }else{
          for (String codTipReg : codListRegiPedi){
            if (codTipReg != null)
              listRegiPedi += "," + codTipReg;
          }
      }
      form.setTipRegiPedi(listRegiPedi.substring(1));
    }
    String codSucuHtb =(String)session.getAttribute("sucursal");
    /*validaciones de niv auto*/
    this.nivelesAutoriz(form);
    if (codSucuHtb.equals("1")) codSucuHtb = "0";
    /*lista de pedidos*/
    List<PedidoAbstract> listPedidos = new ArrayList<PedidoAbstract>();
    if (form.getEstado().equals(ConstantesHermetic.STD_PEND+"")){
      if (form.getComboProc().equals(ConstantesHermetic.TIP_PROC_REG_PEDI_TV) || (form.getTipClie().equals(ConstantesHermetic.TIPO_CLIE_AGEN+""))){
        for (String strKey : form.getNivAutoTVBP().split(",")){
            if (!strKey.trim().isEmpty())
              pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovProp(form.getMapNivAutoTVBP().get(strKey), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_PEND+"", Integer.parseInt(strKey)));
        }
        if (form.getMapNivAutoTVBP().get("0") != null){
          pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovProp(form.getMapNivAutoTVBP().get("0"), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_PEND+"", 1));
        }
      }else{
        for (String strKey : form.getNivAutoTVBB().split(",")){
          if (!strKey.trim().isEmpty())
            pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovBanc(form.getListCodClie(), form.getMapNivAutoTVBB().get(strKey), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(),  ConstantesHermetic.STD_PEND+"", Integer.parseInt(strKey), ConstantesHermetic.NUM_CATE_NIVE_COME));  
        }
        if (form.getMapNivAutoTVBB().get("0") != null){
          pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovBanc(form.getListCodClie(), form.getMapNivAutoTVBB().get("0"), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(),  ConstantesHermetic.STD_PEND+"", 1,ConstantesHermetic.NUM_CATE_NIVE_COME));
        }
      }  
    }else{
      if (form.getComboProc().equals(ConstantesHermetic.TIP_PROC_REG_PEDI_TV) || (form.getTipClie().equals(ConstantesHermetic.TIPO_CLIE_AGEN+""))){
        for (String strKey : form.getNivAutoTVBP().split(",")){
          if (!strKey.trim().isEmpty())
            pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovProp(form.getMapNivAutoTVBP().get(strKey), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_PEND+"", Integer.parseInt(strKey)+1));
        }
        if (form.getMapNivAutoTVBP().get("0") != null){
          pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTvBovProp(form.getMapNivAutoTVBP().get("0"), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_AUTZ+"", 0));
        }
        if (form.getMapNivAutoTVBP().get("-1") != null){
          pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTvBovProp(form.getMapNivAutoTVBP().get("-1"), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_AUTZ+"", 0));
        }
      }else{
        for (String strKey : form.getNivAutoTVBB().split(",")){
          if (!strKey.trim().isEmpty())
            pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovBanc(form.getListCodClie(), form.getMapNivAutoTVBB().get(strKey), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_PEND+"", Integer.parseInt(strKey)+1,ConstantesHermetic.NUM_CATE_NIVE_COME));  
        }
        if (form.getMapNivAutoTVBB().get("0") != null){
          pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovBanc(form.getListCodClie(), form.getMapNivAutoTVBB().get("0"), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_PEND+"", 1,ConstantesHermetic.NUM_CATE_NIVE_AGEN));  
        }
        if (form.getMapNivAutoTVBB().get("-1") != null){
          pedidoService.concatenarPedidos(listPedidos,pedidoService.getListPediTempTvBovBanc(form.getListCodClie(), form.getMapNivAutoTVBB().get("-1"), codSucuHtb, form.getTipRegiPedi(), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getTipoFecha()), form.getFecSoliPediInic(), form.getFecSoliPediFinl(), ConstantesHermetic.STD_PEND+"", 1,ConstantesHermetic.NUM_CATE_NIVE_AGEN)); 
        }
      }
    }
    form.setTipProc(form.getComboProc());
    PedidoTvContainerManagerImpl pedidoContainer = new PedidoTvContainerManagerImpl();
    pedidoContainer.setPedidos(listPedidos);
    if (!form.getEstado().equals(ConstantesHermetic.STD_AUTZ+"")){
      model.put("estAutoriz", 1);
    }else{
      model.put("estAutoriz", 0); 
    }
    model.put("listUnidMone",pedidoContainer.obtiListUnidMoneByDetas());
    model.put("mostrarElementos", 1);
      if (intTipCliente != ConstantesHermetic.TIPO_CLIE_AGEN){
        if (form.getComboProc().equals(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL)){    
          model.put("mostrarElementos", 2);
        }
      }
    request.getSession(false).removeAttribute("listadoPedidosGuardados");
    model.put("listPediBandeja", listPedidos);
    model.put("codOpci",form.getCodOpci());
    model.put("desOpci",form.getDesOpci());
    model.put("listProcesos",form.getListProcesos());
    model.put("listTipoFecha",form.getListTipoFecha());
    model.put("listEstado",form.getListEstado());
    model.put(FORM_KEY,form);
    return FORM_BAND_PETV_VIEW;
  }
  
  @RequestMapping(params={"accion=cambioProc","codProceso"}) 
  protected String cambioProc(ModelMap model,@ModelAttribute(FORM_KEY) HMF2015Form form, HttpServletRequest request, @RequestParam("codProceso") String codProc)throws Exception{  
      int intTipCliente =(Integer)request.getSession(false).getAttribute("tipClie");
      List listBancos;
      int mostrarElementos= 1;
      String listClientes = "";
      String[] codClientes = (String[])request.getSession(false).getAttribute("chksClieCorp");
      if ((form.getComboCliente() != null) && (form.getComboCliente().equals(ALGUNOS))){
        for (String codClies : codClientes){
          if (codClies == null) break;
          listClientes += "," + codClies;
        }
        listClientes = listClientes.substring(1);
      }else{
        listClientes = ((String)request.getSession(false).getAttribute("listClie"));
      }
      if (codProc.equals(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL)){
        listBancos = clienteService.getListBancByClie(listClientes, "");
      }else{
        listBancos = new ArrayList();
      }
          
      if (intTipCliente != ConstantesHermetic.TIPO_CLIE_AGEN){
        if (codProc.equals(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL)){    
          mostrarElementos = 2;
        }
      }
      model.put("mostrarElementos", mostrarElementos);
      model.put("listBancos", listBancos);
      model.put(FORM_KEY,form);
      return FORM_BAND_PETV_VIEW;
  }
  
  protected void nivelesAutoriz(HMF2015Form form){
      form.setNivAutoTVBP("");
      form.setNivAutoTVBB("");
      form.setMapNivAutoTVBP(new HashMap<String,String>());
      form.setMapNivAutoTVBB(new HashMap<String,String>());
      int niveAuto = 0;
      int maxNumNive = 0;
      if ((form.getComboProc().equals(ConstantesHermetic.TIP_PROC_REG_PEDI_TV)) || (form.getTipClie().equals(ConstantesHermetic.TIPO_CLIE_AGEN+""))){
          for (String codClieOrig : form.getListCodClie().split(",")){
            try{
              maxNumNive = configuracionService.getNumNiveAuto(Integer.parseInt(codClieOrig), 0, Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getCodSucuHtb()));
              if (maxNumNive == 0){
                  if (form.getMapNivAutoTVBP().get("0") == null){
                    form.getMapNivAutoTVBP().put("0", codClieOrig);
                  }else{
                    form.getMapNivAutoTVBP().put("0", form.getMapNivAutoTVBP().get("0") + "," + codClieOrig);
                  }
              }else{
                niveAuto = configuracionService.getNiveAutoByUsua(form.getUsuWeb(), Integer.parseInt(codClieOrig), 0, Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getCodSucuHtb()));
              }
            }catch (Exception e){
                niveAuto =0;
            }
            if (niveAuto != 0){
              if (niveAuto == maxNumNive){
                if (form.getMapNivAutoTVBP().get("-1") == null){
                  form.getMapNivAutoTVBP().put("-1", codClieOrig);
                }else{
                  form.getMapNivAutoTVBP().put("-1", form.getMapNivAutoTVBP().get("-1") + "," + codClieOrig);
                }
              }
              if (form.getMapNivAutoTVBP().get(niveAuto+"") == null){
                form.getMapNivAutoTVBP().put(niveAuto+"", codClieOrig);
                form.setNivAutoTVBP(form.getNivAutoTVBP() + "," + niveAuto);
              }else{
                form.getMapNivAutoTVBP().put(niveAuto+"", form.getMapNivAutoTVBP().get(niveAuto+"") + "," + codClieOrig);
              }
            }
          }
          if (form.getNivAutoTVBP().length() > 0)
            form.setNivAutoTVBP(form.getNivAutoTVBP().substring(1));
      }else{
        for (String codClieOrig : form.getListCodClie().split(",")){
          for (String codClieDest : form.getListCodBanc().split(",")){
              try{
                maxNumNive = configuracionService.getNumNiveAuto(Integer.parseInt(codClieOrig), Integer.parseInt(codClieDest), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getCodSucuHtb()));
                if (maxNumNive == 0){
                    if (form.getMapNivAutoTVBB().get("0") == null){
                      form.getMapNivAutoTVBB().put("0", codClieDest);
                    }else{
                      form.getMapNivAutoTVBB().put("0", form.getMapNivAutoTVBB().get("0") + "," + codClieDest);
                    }
                }else{                
                  niveAuto = configuracionService.getNiveAutoByUsua(form.getUsuWeb(), Integer.parseInt(codClieOrig), Integer.parseInt(codClieDest), Integer.parseInt(form.getComboProc()), Integer.parseInt(form.getCodSucuHtb()));
                }
              }catch (Exception e){
                niveAuto =0;
              }
            if (niveAuto != 0){
              if (niveAuto == maxNumNive){
                if (form.getMapNivAutoTVBB().get("-1") == null){
                  form.getMapNivAutoTVBB().put("-1", codClieDest);
                }else{
                  form.getMapNivAutoTVBB().put("-1", form.getMapNivAutoTVBP().get("-1") + "," + codClieDest);
                }
              }
              if (form.getMapNivAutoTVBB().get(niveAuto+"") == null){
                form.getMapNivAutoTVBB().put(niveAuto+"", codClieDest);
                form.setNivAutoTVBB(form.getNivAutoTVBB() + "," + niveAuto);
              }else{
                form.getMapNivAutoTVBB().put(niveAuto+"", form.getMapNivAutoTVBB().get(niveAuto+"") + "," + codClieDest);
              }
            }
          }
        }
        if (form.getNivAutoTVBB().length() > 0)
          form.setNivAutoTVBB(form.getNivAutoTVBB().substring(1));
      }
  }
  
  
  @RequestMapping(params="accion=verPDF")
  protected void verPDF(HttpSession session,HttpServletRequest request,@ModelAttribute(FORM_KEY) HMF2015Form form,HttpServletResponse response)throws Exception{
    if (form.getTipProc().equals(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL) && !form.getTipClie().equals(ConstantesHermetic.TIPO_CLIE_AGEN+"")){
      this.verPDFBB(request, form, response);
    }else{
      this.verPDFBP(request, form, response);
    }
  }
  
  
  @RequestMapping(params="accion=mostrarExcelSustento")
  protected void mostrarExcelSustento(HttpServletRequest request,@ModelAttribute(FORM_KEY) HMF2015Form form,HttpServletResponse response)throws Exception{
      if (form.getTipProc().equals(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL) && !form.getTipClie().equals(ConstantesHermetic.TIPO_CLIE_AGEN+"")){
        this.mostrarExcelSustentoBB(request, form, response);
      }else{
        this.mostrarExcelSustentoBP(request, form, response);
      }
      
  }
  
  @RequestMapping(params={"accion=editPedidoTv","numPedi","codSeri","tipDocuPedi"})
  protected String editPedidoTv(ModelMap model,HttpServletRequest request, @RequestParam("numPedi") String numPedi,@ModelAttribute(FORM_KEY) HMF2015Form form, @RequestParam("codSeri") String codSeri, 
                                                                                   @RequestParam("tipDocuPedi") String tipDocuPedi)throws Exception{
    PedidoAbstract pedidoSelected  = new PedidoTvManagerImpl();
    try {
        pedidoSelected = this.pedidoService.getRetuPediTvTemp(ConstantesHermetic.TIP_DOCU_PEDI_TEMP, codSeri, Integer.parseInt(numPedi));
    } catch (Exception nfe) {
        // TODO: Add catch code
        nfe.printStackTrace();
    }
    form.setObjPedido(pedidoSelected);
    form.setListUnidMone(pedidoSelected.obtiListUnidMoneByDetas().toArray());
    if (pedidoSelected.getTipProc().getCodTipo().equals(ConstantesHermetic.TIP_PROC_REG_PEDI_COMERCIAL)){
      model.put("mostrarCuentas",1);
    }else{
      model.put("mostrarCuentas",0);
    }
    model.put("pedidoSelected",pedidoSelected);
    model.put("listUnidMone",pedidoSelected.obtiListUnidMoneByDetas().toArray());
    return FORM_BAND_EDIT_PETV_VIEW;
  }
  
  protected void mostrarExcelSustentoBB(HttpServletRequest request, HMF2015Form form,HttpServletResponse response)throws Exception{
      try{
          List<PedidoTvManagerImpl> pedidosBean = (List)request.getSession(false).getAttribute("listadoPedidosGuardados");
          PedidoTvContainerManagerImpl pedidoContainer = new PedidoTvContainerManagerImpl();
          pedidoContainer.setPedidos(pedidosBean);
          int tipClie = (Integer)request.getSession(false).getAttribute("tipClie");
          String desCorp = "";
          String desClie = "";

          if (tipClie == ConstantesHermetic.TIPO_CLIE_CORP){
            desCorp = (String)request.getSession(false).getAttribute("desCorp");
            desClie = form.getDesClie(); //combo
          }
          else{
            desClie = (String)request.getSession(false).getAttribute("desRazoSoci");
          }
          String fecSoliPedi = "";
          String horSoliPedi = "";
          String tipPedi = "";
          StringBuffer nomUsua = new StringBuffer();
          nomUsua.append(Util.getUser().getPriNomb()).append(" ");
          nomUsua.append(Util.getUser().getSegNomb()).append(" ");
          nomUsua.append(Util.getUser().getPriApel()).append(" ");
          nomUsua.append(Util.getUser().getSegApel());
          Map <Integer, Integer> mapMaxNive = new HashMap<Integer, Integer>();
          Map <Integer, Integer> mapUsuNive = new HashMap<Integer, Integer>();
          for(PedidoEntity pedidoBean : pedidosBean){
              fecSoliPedi = pedidoBean.getFecSoliPedi();
              horSoliPedi = pedidoBean.getHorSoliPedi();
              tipPedi = pedidoBean.getTipPedi().getCodTipo();
              if (mapMaxNive.get(pedidoBean.getClieOrig().getCodClie()) == null){
                mapMaxNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNumNiveAuto(pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                try{
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNiveAutoByUsua(Util.getUser().getUsuWeb(), pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                }catch(Exception e){
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), 0);
                }
              }
          }
          
          String fecha_srv = servicioHermetic.getFechaHoy();
          String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
          String pathLogo = request.getSession().getServletContext().getRealPath("/images/logo.png");
          Map parameters = new HashMap();
          parameters.put("titulo", "Sustento del Registro de Pedido");
          parameters.put("lst_data", pedidoContainer);
          parameters.put("tip_clie", tipClie);
          parameters.put("tip_proc", form.getTipProc());
          parameters.put("origen_repo", "BBB");
          parameters.put("mapMax", mapMaxNive);
          parameters.put("mapUsu", mapUsuNive);
          parameters.put("des_corp", desCorp);
          parameters.put("des_clie", desClie);
          parameters.put("fec_soli", fecSoliPedi);
          parameters.put("hor_soli", horSoliPedi);
          parameters.put("usuWeb",Util.getUser().getUsuWeb());
          parameters.put("nomUsua",nomUsua.toString());
          parameters.put("tipPedi", servicioHermetic.getDescripcion(ConstantesHermetic.TIPO_PEDIDO+"", tipPedi));
          parameters.put("fecha_srv",fecha_srv);
          parameters.put("hora_srv",hora_srv);
          parameters.put("logo_cabecera",pathLogo);
          
          HSSFWorkbook wb = new HSSFWorkbook(); 
          
          wb=pedidoService.excelSustentoPedidoCome(parameters);
          response.addHeader("Content-type", "application/vnd.ms-excel");
          response.addHeader("Content-Disposition", "attachment; filename=sustentoExcelPedidos.xls");
          response.setContentType("Content-type: application/vnd.ms-excel");
          
          response.setHeader("Cache-Control","cache"); // HTTP 1.1
          response.setHeader("Pragma","cache"); // HTTP 1.0
          response.setDateHeader ("Expires", -1);  
          
          OutputStream out = response.getOutputStream();
          wb.write(out);
          out.close();
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
      }    
  }
  
  protected void mostrarExcelSustentoBP(HttpServletRequest request, HMF2015Form form,HttpServletResponse response)throws Exception{
      try{
          List<PedidoTvManagerImpl> pedidosBean = (List)request.getSession(false).getAttribute("listadoPedidosGuardados");
          PedidoTvContainerManagerImpl pedidoContainer = new PedidoTvContainerManagerImpl();
          pedidoContainer.setPedidos(pedidosBean);
          int tipClie = (Integer)request.getSession(false).getAttribute("tipClie");
          String desCorp = "";
          String desClie = "";

          String fecSoliPedi = "";
          String horSoliPedi = "";
          String tipPedi = "";
          StringBuffer nomUsua = new StringBuffer();
          nomUsua.append(Util.getUser().getPriNomb()).append(" ");
          nomUsua.append(Util.getUser().getSegNomb()).append(" ");
          nomUsua.append(Util.getUser().getPriApel()).append(" ");
          nomUsua.append(Util.getUser().getSegApel());
          String nivAuto = "";
          int maxNive = 0;
          int usuNive = 0;
          Map <Integer, Integer> mapMaxNive = new HashMap<Integer, Integer>();
          Map <Integer, Integer> mapUsuNive = new HashMap<Integer, Integer>();
          for(PedidoEntity pedidoBean : pedidosBean){
              fecSoliPedi = pedidoBean.getFecSoliPedi();
              horSoliPedi = pedidoBean.getHorSoliPedi();
              tipPedi = pedidoBean.getTipPedi().getCodTipo();
              if (mapMaxNive.get(pedidoBean.getClieOrig().getCodClie()) == null){
                maxNive = configuracionService.getNumNiveAuto(pedidoBean.getClieOrig().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb());
                mapMaxNive.put(pedidoBean.getClieOrig().getCodClie(), maxNive);
                try{
                  usuNive = configuracionService.getNiveAutoByUsua(Util.getUser().getUsuWeb(), pedidoBean.getClieOrig().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb());
                }catch(Exception e){
                  usuNive =0;
                }
                mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), usuNive);
              }
          }
          if (tipClie == ConstantesHermetic.TIPO_CLIE_CORP){
            desCorp = (String)request.getSession(false).getAttribute("desCorp");
            desClie = form.getDesClie(); //combo
          }
          else{
              nivAuto = "";
            desClie = (String)request.getSession(false).getAttribute("desRazoSoci");
          }
          String fecha_srv = servicioHermetic.getFechaHoy();
          String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
          String pathLogo = request.getSession().getServletContext().getRealPath("/images/logo.png");
          Map parameters = new HashMap();
          parameters.put("lst_data", pedidoContainer);
          parameters.put("tip_proc", form.getTipProc());
          parameters.put("tip_clie", tipClie);
          parameters.put("origen_repo", "BBP");
          parameters.put("mapMax", mapMaxNive);
          if (usuNive != 0 && maxNive != 0){
            parameters.put("niv_auto", usuNive + " de " + maxNive);
          }else{
            parameters.put("niv_auto", "");
          }
          parameters.put("titulo", "Sustento del Registro de Pedido");
          parameters.put("mapUsu", mapUsuNive);
          parameters.put("des_corp", desCorp);
          parameters.put("des_clie", desClie);
          parameters.put("fec_soli", fecSoliPedi);
          parameters.put("hor_soli", horSoliPedi);
          parameters.put("usuWeb",Util.getUser().getUsuWeb());
          parameters.put("nomUsua",nomUsua.toString());
          parameters.put("tipPedi", servicioHermetic.getDescripcion(ConstantesHermetic.TIPO_PEDIDO+"", tipPedi));
          parameters.put("fecha_srv",fecha_srv);
          parameters.put("hora_srv",hora_srv);
          parameters.put("logo_cabecera",pathLogo);
          
          HSSFWorkbook wb = new HSSFWorkbook(); 
          
          wb=pedidoService.excelSustentoPedido(parameters);
          response.addHeader("Content-type", "application/vnd.ms-excel");
          response.addHeader("Content-Disposition", "attachment; filename=sustentoExcelPedidos.xls");
          response.setContentType("Content-type: application/vnd.ms-excel");
          
          response.setHeader("Cache-Control","cache"); // HTTP 1.1
          response.setHeader("Pragma","cache"); // HTTP 1.0
          response.setDateHeader ("Expires", -1);  
          
          OutputStream out = response.getOutputStream();
          wb.write(out);
          out.close();
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
      }    
  }
  
  protected void verPDFBB(HttpServletRequest request, HMF2015Form form, HttpServletResponse response)throws Exception{
      try{
          HttpSession session = request.getSession(false);
          String rutaJasper = session.getServletContext().getInitParameter("rutajasper");
          StringBuffer jasperPath = new StringBuffer(rutaJasper).append("/").append("HMR2014").append(".jasper");
          int intTipCliente = (Integer)request.getSession(false).getAttribute("tipClie");  //0=corporacion; 1=banco; 2=cc
          Map map = new HashMap();
          JRDataSource simpleDS;
          String fecha_srv = servicioHermetic.getFechaHoy();
          String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
          String fecSoliPedi = null;
          String horSoliPedi = null;
          String tipPedi = null;
          List<PedidoTvManagerImpl> pedidosBean = (List)request.getSession(false).getAttribute("listadoPedidosGuardados");
          PedidoTvContainerManagerImpl pedidoContainer = new PedidoTvContainerManagerImpl();
          Collections.sort(pedidosBean);
          pedidoContainer.setPedidos(pedidosBean);
          simpleDS = new JRBeanCollectionDataSource(pedidosBean);
          Map <Integer, Integer> mapMaxNive = new HashMap<Integer, Integer>();
          Map <Integer, Integer> mapUsuNive = new HashMap<Integer, Integer>();
          for(PedidoEntity pedidoBean : pedidosBean){
              fecSoliPedi = pedidoBean.getFecSoliPedi();
              horSoliPedi = pedidoBean.getHorSoliPedi();
              tipPedi = pedidoBean.getTipPedi().getCodTipo();
              if (mapMaxNive.get(pedidoBean.getClieOrig().getCodClie()) == null){
                mapMaxNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNumNiveAuto(pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                try{
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), configuracionService.getNiveAutoByUsua(Util.getUser().getUsuWeb(), pedidoBean.getClieGrup().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb()));
                }catch(Exception e){
                  mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), 0);
                }
              }
          }
          pedidoContainer.setTipClieProc(intTipCliente);
          Map subReportDS1 = pedidoService.getRepoBovBancDS(pedidoContainer);
          StringBuffer nomUsua = new StringBuffer();
          nomUsua.append(Util.getUser().getPriNomb()).append(" ");
          nomUsua.append(Util.getUser().getSegNomb()).append(" ");
          nomUsua.append(Util.getUser().getPriApel()).append(" ");
          nomUsua.append(Util.getUser().getSegApel());
          if (intTipCliente == ConstantesHermetic.TIPO_CLIE_CORP){
            map.put("nomCorp",(String)session.getAttribute("desCorp"));
            map.put("nomClie",form.getDesClie());
          }else{
            map.put("nomCorp","");
            map.put("nomClie",(String)session.getAttribute("desRazoSoci"));
          }
          map.put("titulo", "SUSTENTO DEL REGISTRO DE PEDIDO");
          map.put("mapMax", mapMaxNive);
          map.put("mapUsu", mapUsuNive);
          map.put("usuWeb",Util.getUser().getUsuWeb());
          map.put("nomUsua",nomUsua.toString());
          map.put("tipPedi", servicioHermetic.getDescripcion(ConstantesHermetic.TIPO_PEDIDO+"", tipPedi));
          map.put("fec_soli_pedi", fecSoliPedi);
          map.put("hor_soli_pedi",horSoliPedi);
          map.put("fec_srv",fecha_srv);
          map.put("hor_srv",hora_srv);
          map.put("subReportDS1",subReportDS1);
          map.put("contextPath",request.getSession().getServletContext().getRealPath("/"));
          ServletOutputStream servletOutputStream = response.getOutputStream();
          InputStream reportStream = session.getServletContext().getResourceAsStream(jasperPath.toString());
          byte[] bytes = null;        
          bytes = JasperRunManager.runReportToPdf(reportStream, map, simpleDS);
          response.setHeader("Cache-Control","cache"); // HTTP 1.1
          response.setHeader("Pragma","cache"); // HTTP 1.0
          response.setDateHeader ("Expires", -1);         
          response.setContentType("application/pdf");
          response.addHeader("Content-Disposition", "inline; filename=Reporte.pdf");        
          response.setContentLength(bytes.length);         
          servletOutputStream.write(bytes, 0, bytes.length);
          servletOutputStream.flush();
          servletOutputStream.close();
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
      }    
  }
  
  protected void verPDFBP(HttpServletRequest request, HMF2015Form form, HttpServletResponse response)throws Exception{
      try{
          HttpSession session = request.getSession(false);
          String rutaJasper = session.getServletContext().getInitParameter("rutajasper");
          StringBuffer jasperPath = new StringBuffer(rutaJasper).append("/").append("HMR2003").append(".jasper");
          Map map = new HashMap();
          int intTipCliente = (Integer)request.getSession(false).getAttribute("tipClie");  //0=corporacion; 1=banco; 2=cc
          JRDataSource simpleDS;
          String fecha_srv = servicioHermetic.getFechaHoy();
          String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
          String fecSoliPedi = null;
          String horSoliPedi = null;
          String tipPedi = null;
          List<PedidoTvManagerImpl> pedidosBean = (List)request.getSession(false).getAttribute("listadoPedidosGuardados");
          PedidoTvContainerManagerImpl pedidoContainer = new PedidoTvContainerManagerImpl();
          Collections.sort(pedidosBean);
          pedidoContainer.setPedidos(pedidosBean);
          simpleDS = new JRBeanCollectionDataSource(pedidosBean);
          int maxNive = 0;
          int usuNive = 0;
          Map <Integer, Integer> mapMaxNive = new HashMap<Integer, Integer>();
          Map <Integer, Integer> mapUsuNive = new HashMap<Integer, Integer>();
          for(PedidoEntity pedidoBean : pedidosBean){
              fecSoliPedi = pedidoBean.getFecSoliPedi();
              horSoliPedi = pedidoBean.getHorSoliPedi();
              tipPedi = pedidoBean.getTipPedi().getCodTipo();
              if (mapMaxNive.get(pedidoBean.getClieOrig().getCodClie()) == null){
                maxNive = configuracionService.getNumNiveAuto(pedidoBean.getClieOrig().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb());
                mapMaxNive.put(pedidoBean.getClieOrig().getCodClie(), maxNive);
                try{
                  usuNive = configuracionService.getNiveAutoByUsua(Util.getUser().getUsuWeb(), pedidoBean.getClieOrig().getCodClie(), pedidoBean.getClieOrig().getCodClie(), Integer.parseInt(pedidoBean.getTipProc().getCodTipo()), pedidoBean.getSucuHtb().getCodSucuHtb());
                }catch(Exception e){
                  usuNive =0;
                }
                mapUsuNive.put(pedidoBean.getClieOrig().getCodClie(), usuNive);
              }
          }
          pedidoContainer.setTipClieProc(intTipCliente);
          Map subReportDS1 = pedidoService.getRepoBovPropDS(pedidoContainer);
          StringBuffer nomUsua = new StringBuffer();
          nomUsua.append(Util.getUser().getPriNomb()).append(" ");
          nomUsua.append(Util.getUser().getSegNomb()).append(" ");
          nomUsua.append(Util.getUser().getPriApel()).append(" ");
          nomUsua.append(Util.getUser().getSegApel());
          if (intTipCliente == ConstantesHermetic.TIPO_CLIE_CORP){
            map.put("nomCorp",(String)session.getAttribute("desCorp"));
            map.put("nomClie",form.getDesClie());
          }else{
            map.put("nomCorp","");
            map.put("nomClie",(String)session.getAttribute("desRazoSoci"));
          }
          if (usuNive != 0 && maxNive != 0){
            map.put("nivAuto", usuNive + " de " + maxNive);
          }else{
            map.put("nivAuto", "");
          }
          map.put("titulo", "SUSTENTO DEL REGISTRO DE PEDIDO");
          map.put("usuWeb",Util.getUser().getUsuWeb());
          map.put("nomUsua",nomUsua.toString());
          map.put("tipPedi", servicioHermetic.getDescripcion(ConstantesHermetic.TIPO_PEDIDO+"", tipPedi));
          map.put("fec_soli_pedi", fecSoliPedi);
          map.put("hor_soli_pedi",horSoliPedi);
          map.put("fec_srv",fecha_srv);
          map.put("hor_srv",hora_srv);
          map.put("subReportDS1",subReportDS1);
          map.put("contextPath",request.getSession().getServletContext().getRealPath("/"));
          ServletOutputStream servletOutputStream = response.getOutputStream();
          InputStream reportStream = session.getServletContext().getResourceAsStream(jasperPath.toString());
          byte[] bytes = null;        
          bytes = JasperRunManager.runReportToPdf(reportStream, map, simpleDS);
          response.setHeader("Cache-Control","cache"); // HTTP 1.1
          response.setHeader("Pragma","cache"); // HTTP 1.0
          response.setDateHeader ("Expires", -1);         
          response.setContentType("application/pdf");
          response.addHeader("Content-Disposition", "inline; filename=Reporte.pdf");        
          response.setContentLength(bytes.length);         
          servletOutputStream.write(bytes, 0, bytes.length);
          servletOutputStream.flush();
          servletOutputStream.close();
      }catch(Exception e){
          logger.error(e);
          e.printStackTrace();
      }    
  }
}
